#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <QDir>
#include "historydao.h"
#include <QFileInfo>
#include <QMessageBox>
#include <QKeyEvent>  // 新增
#include <QDebug>     // 新增：用于调试

// 新增：防止重复刷新的标志
//static bool isRefreshing = false;
MainWindow::MainWindow(int userId,QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    currentUserId(userId)
{
    ui->setupUi(this);
    // 新增：设置窗口可以接收键盘焦点
    setFocusPolicy(Qt::StrongFocus);
    // 初始化静音状态
    isMuted = false;
    volumeBeforeMute = 50; // 默认音量
    initPlayer();
    // 假设历史记录列表的控件名为listWidget_history
    ui->listWidget_history->setFont(QFont("Courier New", 9));  // 设置等宽字体
    connect(players,&QMediaPlayer::positionChanged,this,&MainWindow::on_playerPositionChanged);
    // 手动连接：播放列表索引变化信号 -> 自定义槽函数
    connect(playlist, &QMediaPlaylist::currentIndexChanged,
                this, &MainWindow::handlePlaylistIndexChanged);
    // 新增音量滑块
    ui->volumeSlider->setRange(0,100); //设置音量滑块的范围（0-100）
    ui->volumeSlider->setValue(50);    //默认音量为50
    players->setVolume(50);            //设置初始音量
    // 新增倍速播放功能
    ui->speedSlider->setRange(5,20);   // 滑块范围：5~20（对应0.5x~2.0x，步长0.1x）
    ui->speedSlider->setValue(10);     // 默认1.0x
    ui->speedLable->setText("1.0x");   // 初始显示
    players->setPlaybackRate(1.0);     // 设置播放器初始速率（默认1.0）
    // 新增：关联播放列表索引变化信号
    // 当播放曲目切换时，触发列表选中状态更新
    //connect(playlist, &QMediaPlaylist::currentIndexChanged,this, &MainWindow::handlePlaylistIndexChanged);
    // 在构造函数中添加（如果没有）
    connect(ui->listWidget_music, &QListWidget::itemClicked, [=](QListWidgetItem *item) {
    // 获取点击项的索引，设置为播放列表当前索引
    int index = ui->listWidget_music->row(item);
    playlist->setCurrentIndex(index);
    players->play(); // 可选：点击后自动播放
    });

//    // 新增：连接历史记录刷新按钮
//    connect(ui->pushButton_refreshHistory, &QPushButton::clicked,
//           this, &MainWindow::on_pushButton_refreshHistory_clicked);

//    // 新增：连接历史记录列表双击事件
//    connect(ui->listWidget_history, &QListWidget::itemDoubleClicked,
//           this, &MainWindow::on_listWidget_history_itemDoubleClicked);

    // 新增：加载历史记录
    loadPlayHistory();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::initPlayer()
{
    players = new QMediaPlayer();
    playlist = new QMediaPlaylist();
    players->setPlaylist(playlist);
    playlist->setPlaybackMode(QMediaPlaylist::Loop);  // 设置列表循环
}

void MainWindow::addMusic()
{
    for(auto file:musicFiles)
    {
        playlist->addMedia(QUrl::fromLocalFile(path + "/" + file));
    }
    playlist->setCurrentIndex(0);

}

// 新增：键盘事件处理
void MainWindow::keyPressEvent(QKeyEvent *event)
{
    // 处理右箭头键 - 快进
    if (event->key() == Qt::Key_Right) {
        fastForward();
        event->accept();  // 标记事件已处理
        return;
    }

    // 可选：添加左箭头键 - 快退
    if (event->key() == Qt::Key_Left) {
        // 快退5秒
        qint64 newPosition = players->position() - 5000; // 5秒
        if (newPosition < 0) newPosition = 0;
        players->setPosition(newPosition);
        event->accept();
        return;
    }

    // 可选：添加空格键 - 播放/暂停
    if (event->key() == Qt::Key_Space) {
        on_pushButton_change_clicked();
        event->accept();
        return;
    }

    // 新增：处理 M 键 - 静音/取消静音
    if (event->key() == Qt::Key_M) {
        toggleMute();
        event->accept();
        return;
    }
    // 其他按键交给父类处理
    QMainWindow::keyPressEvent(event);
}

void MainWindow::on_pushButton_look_clicked()
{
    path = QFileDialog::getExistingDirectory(this,"Music","E:/music");
    QDir dir(path,"*.mp3");
    musicFiles = dir.entryList();
    ui->listWidget_music->addItems(musicFiles);
    addMusic();
}

void MainWindow::on_playerPositionChanged(qint64 position)
{
    qint64 duration = players->duration(); // 歌曲总时长
//    qint64 pos = players->position();
    QString time = QString("%1:%2/%3:%4")
            .arg(position/1000/60,2,10,QChar('0'))
            .arg(position/1000%60,2,10,QChar('0'))
            .arg(duration/1000/60,2,10,QChar('0'))
            .arg(duration/1000%60,2,10,QChar('0'));
    ui->label_time->setText(time);
    ui->horizontalSlider->setMaximum(duration);
    ui->horizontalSlider->setValue(position);
    int i = playlist->currentIndex();
    ui->label_musicName->setText(musicFiles[i]); // 音乐名字显示到label中
}

void MainWindow::on_listWidget_music_itemDoubleClicked(QListWidgetItem *item)
{
    int i = ui->listWidget_music->currentRow();
    playlist->setCurrentIndex(i);
    players->play();
    ui->label_musicName->setText(musicFiles[i]); // 音乐名字显示到label中
}

void MainWindow::on_horizontalSlider_sliderReleased()
{
    qint64 value = ui->horizontalSlider->value(); //获取滑块位置
    players->setPosition(value);
}

void MainWindow::on_pushButton_change_clicked()
{
    if(players->state() == QMediaPlayer::PlayingState) //播放状态 state是播放状态的一个封装函数
    {
        players->pause(); // 暂停播放
    }
    else if(players->state() == QMediaPlayer::PausedState) // 暂停状态
    {
        players->play(); // 继续播放
        //saveCurrentPlayHistory();
    }
}

void MainWindow::on_pushButton_pri_clicked()
{
    playlist->previous();
    players->play();
    int i = playlist->currentIndex();
    ui->label_musicName->setText(musicFiles[i]); // 音乐名字显示到label中
}

void MainWindow::on_pushButton_next_clicked()
{
    playlist->next();
    players->play();
    int i = playlist->currentIndex();
    ui->label_musicName->setText(musicFiles[i]); // 音乐名字显示到label中
}

void MainWindow::on_comboBox_currentIndexChanged(int index)
{

    switch(index)
    {
        case 0:
            playlist->setPlaybackMode(QMediaPlaylist::Sequential);
            break;
        case 1:
            playlist->setPlaybackMode(QMediaPlaylist::CurrentItemInLoop);
            break;
        case 2:
            playlist->setPlaybackMode(QMediaPlaylist::Random);
            break;
        default:
            playlist->setPlaybackMode(QMediaPlaylist::Sequential);
            break;
    }
}
// 自动生成的槽函数，滑块值变化时自动触发
void MainWindow::on_volumeSlider_valueChanged(int value)
{
    players->setVolume(value);   // 将滑块的值设置为播放器音量
    // 如果用户手动调整音量，自动取消静音状态
    if (isMuted && value > 0) {
        isMuted = false;
        volumeBeforeMute = value; // 更新静音前的音量
        ui->statusBar->showMessage("取消静音", 1000);
    }

    // 如果用户将音量调为0，自动设置为静音状态
    if (value == 0 && !isMuted) {
        isMuted = true;
        volumeBeforeMute = 50; // 设置默认静音前的音量
    }
}

void MainWindow::on_speedSlider_valueChanged(int value)
{
    // 将滑块值（5~20）转换为实际速率（0.5~2.0）
    double rate = value / 10.0;
    // 设置播放器速率
    players->setPlaybackRate(rate);
    // 更新显示当前倍速（保留1位小数）
    ui->speedLable->setText(QString("%1x").arg(rate,0,'f',1));
}

// 修改槽函数名
void MainWindow::handlePlaylistIndexChanged(int index)
{
    if (index < 0 || index >= ui->listWidget_music->count()) {
        return;
    }

    ui->listWidget_music->setCurrentRow(index);

    // 添加防重复调用检查
    static int lastHandledIndex = -1;
    if (index != lastHandledIndex) {
        saveCurrentPlayHistory();
        lastHandledIndex = index;
    }

    QListWidgetItem *currentItem = ui->listWidget_music->item(index);
    if (currentItem) {
        ui->listWidget_music->scrollToItem(currentItem, QAbstractItemView::EnsureVisible);
    }
}

void MainWindow::saveCurrentPlayHistory()
{
    // 检查当前是否有播放的音乐
    if (playlist->currentIndex() < 0 || musicFiles.isEmpty()) {
        return;
    }

    // 获取当前播放的音乐文件名（不含路径）
    QString currentMusicPath = musicFiles[playlist->currentIndex()];
    QString musicName = QFileInfo(currentMusicPath).fileName(); // 提取文件名

    // 调用HistoryDao保存记录
    bool success = historydao::getInstance().savePlayHistory(currentUserId, musicName);
    if (!success) {
        qDebug() << "当前播放记录保存失败";
    }
    else
    {
        loadPlayHistory();
    }
}

// 新增：加载历史记录
void MainWindow::loadPlayHistory()
{
    QList<PlayHistoryRecord> historyList = historydao::getInstance().getPlayHistory(currentUserId);
    ui->listWidget_history->clear();

    for (const PlayHistoryRecord &record : historyList) {
        // 格式化时间显示
        QDateTime playTime = QDateTime::fromString(record.playTime, "yyyy-MM-dd HH:mm:ss");
        QString formattedTime = playTime.toString("MM/dd HH:mm");

        // 创建显示文本：音乐名 + 播放时间
        // 格式化文本：音乐名左对齐占20个字符，时间右对齐
        QString displayText = QString("%1 - %2")
            .arg(record.musicName, -15)  // 音乐名左对齐，占30字符宽度
            .arg(formattedTime, 8);      // 时间右对齐，占8字符宽度
        QListWidgetItem *item = new QListWidgetItem(displayText);

        // 将原始音乐名存储在item的UserRole中，方便双击播放时使用
        item->setData(Qt::UserRole, record.musicName);

        ui->listWidget_history->addItem(item);
    }

    // 可选：在状态栏显示记录数量
    ui->statusBar->showMessage(QString("已加载 %1 条历史记录").arg(historyList.size()), 5000);
}

// 新增：快进功能实现
void MainWindow::fastForward()
{
    if (!players || players->state() != QMediaPlayer::PlayingState) {
        return;  // 播放器不存在或未在播放状态
    }

    qint64 currentPosition = players->position();
    qint64 duration = players->duration();

    // 快进10秒
    qint64 newPosition = currentPosition + 10000; // 10秒

    // 确保不超过总时长
    if (newPosition > duration) {
        newPosition = duration;
    }

    // 设置新位置
    players->setPosition(newPosition);

    // 可选：在状态栏显示快进提示
    ui->statusBar->showMessage(QString("快进到 %1:%2")
                              .arg(newPosition/1000/60, 2, 10, QChar('0'))
                              .arg(newPosition/1000%60, 2, 10, QChar('0')),
                              1000); // 显示1秒

    qDebug() << "快进：从" << currentPosition << "到" << newPosition;
}

// 新增：静音功能实现
void MainWindow::toggleMute()
{
    if (isMuted) {
        // 取消静音，恢复之前的音量
        players->setVolume(volumeBeforeMute);
        ui->volumeSlider->setValue(volumeBeforeMute);
        isMuted = false;
        ui->statusBar->showMessage(QString("取消静音 - 音量: %1").arg(volumeBeforeMute), 2000);
        qDebug() << "取消静音，音量恢复为:" << volumeBeforeMute;
    } else {
        // 静音，保存当前音量并设置为0
        volumeBeforeMute = players->volume();
        players->setVolume(0);
        ui->volumeSlider->setValue(0);
        isMuted = true;
        ui->statusBar->showMessage("已静音", 2000);
        qDebug() << "静音，保存的音量为:" << volumeBeforeMute;
    }
}
// 新增：刷新历史记录按钮点击事件
void MainWindow::on_pushButton_refreshHistory_clicked()
{
    // 防止重复点击
    ui->pushButton_refreshHistory->setEnabled(false);

    loadPlayHistory();
    QMessageBox::information(this, "提示", "历史记录已刷新");

    // 重新启用按钮
    ui->pushButton_refreshHistory->setEnabled(true);
}

// 新增：历史记录项双击事件
void MainWindow::on_listWidget_history_itemDoubleClicked(QListWidgetItem *item)
{
    QString musicName = item->text();

    // 在音乐文件列表中查找对应的音乐
    for (int i = 0; i < musicFiles.size(); ++i) {
        if (musicFiles[i] == musicName) {
            // 找到对应的音乐，设置播放列表当前索引并播放
            playlist->setCurrentIndex(i);
            players->play();

            // 更新界面显示
            ui->listWidget_music->setCurrentRow(i);
            ui->label_musicName->setText(musicName);
            return;
        }
    }

    // 如果没有找到对应的音乐文件
    QMessageBox::warning(this, "提示",
                        QString("找不到音乐文件: %1\n请确保音乐文件仍在原位置").arg(musicName));
}
